package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"
	"strings"
)

func convertContent(content string) string {
	// 转换标题和脚注
	re := regexp.MustCompile(`\\section\{(.*?)\}\\footnote\{(.*?)\}`)
	content = re.ReplaceAllString(content, "== ${1} #footnote[${2}]\n#guwendoc(\n")

	re = regexp.MustCompile(`\\subsection\{(.*?)\}\\footnote\{(.*?)\}`)
	content = re.ReplaceAllString(content, "")

	re = regexp.MustCompile(`\\subsection\{(.*?)\}`)
	content = re.ReplaceAllString(content, "")

	// 转换文言文环境
	// 修改正则表达式处理换行符
	re = regexp.MustCompile(`(?m)\\begin\{wenyan\}(\r?\n)`)
	content = re.ReplaceAllString(content, "[")

	re = regexp.MustCompile(`(?m)(\r?\n)?\\end\{wenyan\}(\r?\n)?`)
	content = re.ReplaceAllString(content, "],\n")

	// 移除列切换命令
	re = regexp.MustCompile(`\r?\n\\paracolswitchcolumn\r?\n`)
	content = re.ReplaceAllString(content, "],\n[")

	// 确保段落格式正确
	re = regexp.MustCompile(`\n\s*\n`)
	content = re.ReplaceAllString(content, "\n\n")

	// 在末尾添加右中括号并换行
	content += "\n)\n"

	return content
}

func main() {
	// 递归查找所有.tex文件
	err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() && filepath.Ext(path) == ".tex" {
			// 读取原文件内容
			content, err := ioutil.ReadFile(path)
			if err != nil {
				fmt.Printf("读取文件 %s 错误: %v\n", path, err)
				return nil
			}

			// 转换内容
			newContent := convertContent(string(content))

			// 创建相同目录结构的新文件
			newPath := strings.TrimSuffix(path, ".tex") + ".typ"
			//dir := filepath.Dir(newPath)
			// if dir != "." {
			// 	if err := os.MkdirAll(dir, 0755); err != nil {
			// 		fmt.Printf("创建目录 %s 错误: %v\n", dir, err)
			// 		return nil
			// 	}
			// }

			// 写入新文件
			err = ioutil.WriteFile(newPath, []byte("#import \"../styles.typ\": *\n\n"+newContent), 0644)
			if err != nil {
				fmt.Printf("写入文件 %s 错误: %v\n", newPath, err)
				return nil
			}

			fmt.Printf("转换完成: %s -> %s\n", path, newPath)
		}
		return nil
	})

	if err != nil {
		fmt.Println("遍历目录错误:", err)
	}
}